package pikasial;

import java.io.File;
import javax.swing.SwingUtilities;

/**
 * La classe principale du programme.
 * <p>
 * Crée ou récupère la configuration du programme, le système de fichiers
 * et l'interface graphique.
 *
 * @author ESIAL - Groupe 14
 */
public final class Pikasial {

    /** Le programme est-il en mode restreint? */
    private static boolean restrictedMode = false;

    /** Fenêtre principale de l'application. */
    private static pikasial.graphique.PikasialFrame frame;


    /** Crée le fichier de configuration et la configuration par défaut. */
    private static void createConfigurationFolder() {
        try {
            File confFolder = new File(Configuration.getInstance().
            		getProperty(Configuration.CONFIG_FOLDER_PROP));
            confFolder.mkdir();
            File thumbFolder = new File(Configuration.getInstance().
            		getProperty(Configuration.THUMB_FOLDER_PROP));
            thumbFolder.mkdir();
        } catch (SecurityException se) {
            System.err.println(
                "Warning: Impossible de créer le dossier de "
                + "configuration ~/.pikasial. Verifiez que "
                + "vous avez bien les droits d'ecriture sur "
                + "votre dossier personnel.");
            restrictedMode = true;
        }
    }

    public static pikasial.images.ListeAlbums getListeAlbums() {
    	return pikasial.images.ListeAlbums.getInstance();
    }

    /**
     * Permet d'accèder à la fenêtre principale de l'application.
     *
     * @return la fenetre de l'application
     * @see pikasial.graphique.PikasialFrame
     */
    public static pikasial.graphique.PikasialFrame getFrame() {
        return frame;
    }

    /**
     * Permet d'accèder au système de fichiers de Pikasial.
     *
     * @return l'instance du système de fichier de Piksial
     * @see pikasial.fs.PikasialFS
     */
    public static pikasial.fs.PikasialFS getPikasialFS() {
        return pikasial.fs.PikasialFS.getInstance();
    }

    /**
     * Indique si le programme s'execute en mode restreint ou non.
     *
     * @return true si le programme est en mode restreint,
     * false sinon.
     */
    public static boolean isRestrictedModeEnabled() {
        return restrictedMode;
    }

    public static void setRestrictedMode(boolean b) { restrictedMode = b; }

    /**
     * Point d'entrée du programme, crée une instance de Pikasial.
     *
     * @param args - les arguments de la ligne de commande
     */
    public static void main(final String[] args) {
        try {
            File conf = new File(Configuration.DEF_CONFIG_FOLDER);
            if (!conf.exists())
            	createConfigurationFolder();

        } catch (SecurityException se) {
            System.err.println("Warning: ne peut acceder au dossier de "
                + "configuration ~/.pikasial ou à ses "
                + "sous-repertoires ! Verifiez que ces fichiers "
                + "sont bien accessibles en lecture.");
            restrictedMode = true;
        }
        final pikasial.graphique.SplashScreen splash = new pikasial.graphique.SplashScreen();
        splash.afficherSplashScreen();
        splash.repaint();
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            	frame = new pikasial.graphique.PikasialFrame();
                frame.setVisible(true);
            }
        });
    }

    /**
     * Constructeur privé et vide.
     */
    private Pikasial() {
    }
}
